package pl.wroc.pwr.mss.server.service.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import pl.wroc.pwr.mss.logic.domain.AbstractEntity;
import pl.wroc.pwr.mss.server.dao.GenericDao;
import pl.wroc.pwr.mss.server.service.GenericService;

/**
 * Implementacja generycznego serwisu.
 * 
 * @author mjagus
 *
 * @param <T> Typ encji ktora serwis ma obslugiwac
 * @param <I> Typ identyfikatora encji
 */
public class GenericServiceImpl<T extends AbstractEntity, I extends Serializable> implements GenericService<T, I>
{
    /**
     * Generyczne dao wykorzystywane przez ten serwis w celu pozyskiwania
     * danych o encjach.
     */
    private GenericDao<T, I> dao;

    /**
     * Zwraca dao wykorzystywane przez ten serwis.
     * 
     * @return dao wykorzystywane przez ten serwis
     */
    public GenericDao<T, I> getDao()
    {
        return dao;
    }

    /**
     * Ustawia dao wykorzystywane przez ten serwis.
     * 
     * @param dao Nowe dao
     */
    public void setDao(GenericDao<T, I> dao)
    {
        this.dao = dao;
    }

    @Override
    public T findById(I id)
    {
        return dao.findById(id);
    }

    @Override
    public List<T> findAll()
    {
        return dao.findAll();
    }

    @Override
    public int countAll()
    {
        return dao.countAll();
    }

    @Override
    public Collection<T> findAllById(Collection<I> ids)
    {
        List<T> results = new ArrayList<T>(ids.size());
        for(I id:ids)
        {
            T entity = dao.findById(id);
            if(entity!=null)
                results.add(entity);
        }

        return results;
    }

    @Override
    public void remove(T entity)
    {
        dao.remove(entity);
    }

    @Override
    public T save(T entity)
    {
        return dao.save(entity);
    }

    @Override
    public String getClassName()
    {
        return dao.getClassName();
    }

    @Override
    public boolean entityByFieldExists(String field, String value)
    {
        return dao.entityByFieldExists(field, value);
    }

    @Override
    public List<T> findEntityByFieldValue(String field, String value)
    {
        return dao.findEntityByFieldValue(field, value);
    }

}
